# 演示pywt.threshold的用法

import numpy as np
import pywt # 确保你已经安装了 PyWavelets 库：pip install PyWavelets

# 1. 创建一个示例信号
data = np.array([-3.0, -2.5, -1.0, 0.0, 1.0, 2.5, 3.0, 4.0])
value = 2.0 # 阈值

print(f"原始数据: {data}")
print(f"阈值 (value): {value}\n")

# 2. 应用 'soft' 模式阈值处理
# |x| < 2.0 的替换为 0。|x| >= 2.0 的，x/abs(x) * (abs(x) - 2.0)
# 例如：-2.5 -> -2.5/2.5 * (2.5 - 2.0) = -1 * 0.5 = -0.5
# 3.0 -> 3.0/3.0 * (3.0 - 2.0) = 1 * 1.0 = 1.0
soft_thresholded = pywt.threshold(data, value, mode='soft', substitute=0)
print(f"'soft' 模式结果: {soft_thresholded}")

# 3. 应用 'hard' 模式阈值处理
# |x| < 2.0 的替换为 0。|x| >= 2.0 的保持不变。
hard_thresholded = pywt.threshold(data, value, mode='hard', substitute=0)
print(f"'hard' 模式结果: {hard_thresholded}")

# 4. 应用 'garrote' 模式阈值处理
# |x| < 2.0 的替换为 0。|x| >= 2.0 的，x * (1 - value^2 / x^2)。
# 例如：-2.5 -> -2.5 * (1 - 2^2 / (-2.5)^2) = -2.5 * (1 - 4/6.25) = -2.5 * (1 - 0.64) = -2.5 * 0.36 = -0.9
# 3.0 -> 3.0 * (1 - 2^2 / 3^2) = 3.0 * (1 - 4/9) = 3.0 * (5/9) = 1.666...
garrote_thresholded = pywt.threshold(data, value, mode='garrote', substitute=0)
#print(f"'garrote' 模式结果: {garrote_thresholded:.2f}")
print(f"'garrote' 模式结果: {np.array2string(garrote_thresholded, precision=2, separator=', ')}")
# 5. 应用 'greater' 模式阈值处理
# x < 2.0 的替换为 0。x >= 2.0 的保持不变。
greater_thresholded = pywt.threshold(data, value, mode='greater', substitute=0)
print(f"'greater' 模式结果: {greater_thresholded}")

# 6. 应用 'less' 模式阈值处理
# x > 2.0 的替换为 0。x <= 2.0 的保持不变。
less_thresholded = pywt.threshold(data, value, mode='less', substitute=0)
print(f"'less' 模式结果: {less_thresholded}")

# 你也可以尝试不同的 substitute 值
print("\n--- 尝试不同的 substitute 值 (例如：-99) ---")
substitute_value = -99
soft_thresholded_sub = pywt.threshold(data, value, mode='soft', substitute=substitute_value)
print(f"'soft' 模式 (substitute={substitute_value}) 结果: {soft_thresholded_sub}")

hard_thresholded_sub = pywt.threshold(data, value, mode='hard', substitute=substitute_value)
print(f"'hard' 模式 (substitute={substitute_value}) 结果: {hard_thresholded_sub}")